/*
 * $Id: DateUtils.java 14 2014-08-15 11:50:17Z ratking $
 *
 * Copyleft (C) 2014 RatKing. All wrongs reserved.
 */
package cn.ratking.demo.jaws7.common;

import java.util.Calendar;
import java.util.Date;

/**
 * 日期实用工具类
 */
public class DateUtils {

    /** 禁止实例化 */
    private DateUtils() {
    }

    /**
     * 将日期的时分秒部分变为"0:0:0.000"。通常用于查询条件中开始日期的初始化
     *
     * @param date 日期
     * @return 时分秒部分为"0:0:0.000"的日期
     */
    public static Date getBeginDate(Date date) {
        if (date == null) {
            return null;
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }

    /**
     * 将日期的时分秒部分变为"23:59:59.999"。通常用于查询条件中结束日期的初始化
     *
     * @param date 日期
     * @return 时分秒部分为"23:59:59.999"的日期
     */
    public static Date getEndDate(Date date) {
        if (date == null) {
            return null;
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);

        return calendar.getTime();
    }

    /**
     * 返回流逝时间的中文描述(比如：x天h小时m分s秒SSS毫秒)
     *
     * @param elapsedTime 从开始到结束流逝时间的毫秒数
     * @return 时间差的中文描述(比如：d天h小时m分s秒SSS毫秒)
     */
    public static String getChineseTimeConsuming(long elapsedTime) {
        int day = (int) (elapsedTime / 1000 / 60 / 60 / 24);
        int hour = (int) ((elapsedTime % (1000 * 60 * 60 * 24)) / 1000 / 60 / 60);
        int minute = (int) ((elapsedTime % (1000 * 60 * 60 * 24) % (1000 * 60
                * 60)) / 1000 / 60);
        int second = (int) ((elapsedTime / 1000) % 60);
        int millisecond = (int) (elapsedTime % 1000);

        StringBuilder sb = new StringBuilder();
        if (elapsedTime > 0) {
            if (day > 0) {
                sb.append(day).append("天");
            }
            if (hour > 0) {
                sb.append(hour).append("小时");
            }
            if (minute > 0) {
                sb.append(minute).append("分");
            }
            if (second > 0) {
                sb.append(second).append("秒");
            }
            if (millisecond > 0) {
                sb.append(millisecond).append("毫秒");
            }
        } else {
            sb.append("0秒");
        }

        return sb.toString();
    }

    /**
     * 返回时间差的中文描述(比如：x天h小时m分s秒SSS毫秒)
     *
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @return 时间差的中文描述(比如：d天h小时m分s秒SSS毫秒)
     */
    public static String getChineseTimeConsuming(Date beginTime, Date endTime) {
        if (beginTime.after(endTime)) {
            Date tmp = beginTime;
            beginTime = endTime;
            endTime = tmp;
        }

        // 时间差(毫秒)
        long elapsedTime = endTime.getTime() - beginTime.getTime();
        return getChineseTimeConsuming(elapsedTime);
    }
}
